home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / Reference / DevCon / Milan_1991 / Devcon91.1 / Libraries / Intuition / other_examples / StrDemo / strgad.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-01  |  4.4 KB  |  173 lines

  1. /* strgad.c -- easy create/destroy of string gadgets    */
  2.  
  3. /*
  4. Copyright (c) 1989 Commodore-Amiga, Inc.
  5.  
  6. Executables based on this information may be used in software
  7. for Commodore Amiga computers. All other rights reserved.
  8. This information is provided "as is"; no warranties are made.
  9. All use is at your own risk, and no liability or responsibility
  10. is assumed.
  11. */
  12.  
  13. #include <exec/types.h>
  14. #include <exec/memory.h>
  15. #include <intuition/intuition.h>
  16. #include <intuition/sghooks.h>
  17. #include "strgad.h"
  18.  
  19. /* getStringGadget()
  20.  *
  21.  * sets flags to some default values, override them after
  22.  * it is allocated.  Likewise LongInt: set it up after
  23.  * the fact.
  24.  */
  25.  
  26. struct SG {
  27.     struct Gadget        sg_Gadget;
  28.     struct StringInfo    sg_Info;
  29.     struct Border        sg_Border;
  30.     UWORD            sg_XY[ 10 ];
  31.     struct IntuiText    sg_IText;
  32. };
  33.  
  34. struct Gadget *getOneSG();
  35.  
  36. struct Gadget *
  37. getStringGadgets( sgs, num )
  38. struct SGSpec    *sgs;
  39. {
  40.     struct Gadget    *firstg;
  41.     struct Gadget    *sg;
  42.  
  43.     if ( num <= 0 ) return ( NULL );
  44.  
  45.     if ( ! (firstg = sg = getOneSG( sgs )) ) return ( NULL );
  46.  
  47.     while ( --num )
  48.     {
  49.     if ( !(sg->NextGadget = getOneSG( ++sgs )) )
  50.     {
  51.         freeStringGadgets( firstg, num );
  52.         return ( NULL );
  53.     }
  54.     sg = sg->NextGadget;
  55.     }
  56.     return ( firstg );
  57. }
  58.  
  59. /*
  60.  * stops at null terminator or NULL link
  61.  * can use -1 for num
  62.  * returns next gadget in chain
  63.  */
  64. struct Gadget *
  65. freeStringGadgets( sgadget, num )
  66. struct Gadget    *sgadget;
  67. {
  68.     int memsize;
  69.     struct Gadget *nextgadget;
  70.  
  71.     while ( sgadget && num-- )
  72.     {
  73.     memsize = sizeof ( struct SG );
  74.     memsize += 2 * (((struct StringInfo *) sgadget->SpecialInfo)->MaxChars);
  75.     nextgadget = sgadget->NextGadget;
  76.     FreeMem( sgadget, (LONG) memsize );
  77.     sgadget = nextgadget;
  78.     }
  79.     return ( sgadget );
  80. }
  81.  
  82. struct Gadget *
  83. getOneSG( sgs )
  84. struct SGSpec    *sgs;
  85. {
  86.     int        memsize;
  87.     CPTR    membase;
  88.     struct SG       *sg;
  89.     struct Gadget    *sgadget;
  90.     struct StringInfo   *sinfo;
  91.     WORD        *xyp;
  92.     int            txlength;
  93.  
  94.     /* figure out how much memory to allocate    */
  95.     memsize = sizeof ( struct SG );
  96.     memsize += 2 * (sgs->sgs_NumChars + 1);    /* for buffers    */
  97.  
  98.     /* try to get the memory    */
  99.     membase = (CPTR) AllocMem( (ULONG) memsize, (ULONG) MEMF_CLEAR );
  100.     if ( membase == NULL ) return ( NULL );
  101.  
  102.     /* hook together pieces of memory    */
  103.     sg = (struct SG *) membase;
  104.     membase += sizeof (struct SG);
  105.  
  106.     sg->sg_Info.Buffer = (UBYTE *) membase;
  107.     membase += sgs->sgs_NumChars + 1;
  108.     sg->sg_Info.UndoBuffer = (UBYTE *) membase;
  109.  
  110.     sgadget = &sg->sg_Gadget;
  111.     sgadget->SpecialInfo =  (APTR) &sg->sg_Info;
  112.     sinfo = &sg->sg_Info;
  113.     sgadget->GadgetRender = (APTR) &sg->sg_Border;
  114.     sgadget->GadgetText = &sg->sg_IText;
  115.  
  116.     /* initialize text        */
  117.     sg->sg_IText.FrontPen = 1;
  118.     sg->sg_IText.BackPen =  0;
  119.     sg->sg_IText.DrawMode = JAM2;
  120.     txlength = TextLength( sgs->sgs_RPort, sgs->sgs_Title,
  121.     (LONG) strlen( sgs->sgs_Title ) );
  122.     sg->sg_IText.LeftEdge = -TITLEGAP - txlength;
  123.     sg->sg_IText.TopEdge = 0;
  124.     sg->sg_IText.ITextFont = NULL;
  125.     sg->sg_IText.NextText = NULL;
  126.     sg->sg_IText.IText = (UBYTE *) sgs->sgs_Title;    /* note: no copy    */
  127.  
  128.     /* initialize border    */
  129.     sg->sg_Border.LeftEdge = sg->sg_Border.TopEdge = 0;
  130.     sg->sg_Border.FrontPen = 1; sg->sg_Border.BackPen = 0;
  131.     sg->sg_Border.DrawMode = JAM2;
  132.     sg->sg_Border.Count = 5;
  133.     sg->sg_Border.XY = (SHORT *) sg->sg_XY;
  134.     sg->sg_Border.NextBorder = NULL;
  135.  
  136.     /* initialize string info    */
  137.     sinfo->BufferPos = 0;
  138.     sinfo->MaxChars = sgs->sgs_NumChars + 1;
  139.     sinfo->DispPos = 0;
  140.  
  141.     /* initialize gadget    */
  142.     sgadget->NextGadget = NULL;
  143.     sgadget->LeftEdge = sgs->sgs_Left;
  144.     sgadget->TopEdge = sgs->sgs_Top;
  145.     sgadget->Width = sgs->sgs_Width;
  146.     sgadget->Height = sgs->sgs_TxHeight + 2;
  147.     sgadget->Flags = GADGHCOMP;
  148.     sgadget->Activation = RELVERIFY | sgs->sgs_StringActives;
  149.     sgadget->GadgetType = STRGADGET;
  150.     sgadget->GadgetID = sgs->sgs_ID;
  151.     sgadget->UserData = NULL;
  152.     {
  153.     UBYTE    *to;
  154.     UBYTE    *from;
  155.     to = sinfo->Buffer;
  156.     from = (UBYTE *) sgs->sgs_InitString;
  157.  
  158.     while (*to++ = *from++);
  159.     }
  160.     
  161.  
  162.     /* init border polyline    */
  163.     xyp = (WORD *) sg->sg_XY;
  164.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = -(1+BORDERGAP);
  165.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = sgadget->Height+BORDERGAP;
  166.     *xyp++ = -(1+BORDERGAP); *xyp++ = sgadget->Height+BORDERGAP;
  167.     *xyp++ = -(1+BORDERGAP); *xyp++ = -(1+BORDERGAP);
  168.     *xyp++ = sgadget->Width+BORDERGAP; *xyp++ = -(1+BORDERGAP);
  169.  
  170.     return ( sgadget );
  171. }
  172.  
  173.